//
//  OCTool.m
//  SpriteKitDemo
//
//  Created by lizhijun on 2023/4/19.
//

#import "OCTool.h"

@implementation OCTool
+ (UIImage *) imageToTransparent:(NSString*) imageStr deleteWhite:(BOOL)deleteWhite
 
{
// 分配内存
    UIImage * image = [UIImage imageNamed:imageStr];
const int imageWidth = image.size.width;
 
const int imageHeight = image.size.height;
 
size_t bytesPerRow = imageWidth * 4;
 
uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight);
 
 
// 创建context
 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
 
CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpace,
                                             
                                             kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
    CGContextClearRect(context, CGRectMake(0, 0, imageWidth, imageHeight));
CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);
 
 
 
// 遍历像素
 
int pixelNum = imageWidth * imageHeight;
 
uint32_t* pCurPtr = rgbImageBuf;
 
for (int i = 0; i < pixelNum; i++, pCurPtr++)
    
{
    
    //        //去除白色...将0xFFFFFF00换成其它颜色也可以替换其他颜色。
    
    //        if ((*pCurPtr & 0xFFFFFF00) >= 0xffffff00) {
    
    //
    
    //            uint8_t* ptr = (uint8_t*)pCurPtr;
    
    //            ptr[0] = 0;
    
    //        }
    
    //接近白色
    
    //将像素点转成子节数组来表示---第一个表示透明度即ARGB这种表示方式。ptr[0]:透明度,ptr[1]:R,ptr[2]:G,ptr[3]:B
    
    //分别取出RGB值后。进行判断需不需要设成透明。
    
    uint8_t* ptr = (uint8_t*)pCurPtr;
    if (deleteWhite)
    {
        if (ptr[1] > 240 && ptr[2] > 240 && ptr[3] > 240) {
            
            //当RGB值都大于240则比较接近白色的都将透明度设为0.-----即接近白色的都设置为透明。某些白色背景具有杂质就会去不干净，用这个方法可以去干净
            
            ptr[0] = 0;
            
        }
    }else
    {
        //abgr
        if ((ptr[3] > 130 && ptr[3] < 150) && (ptr[2] > 225 && ptr[2] < 250) && (ptr[1] >= 134 && ptr[1] < 155)) {
      
            
            //当RGB值都大于240则比较接近白色的都将透明度设为0.-----即接近白色的都设置为透明。某些白色背景具有杂质就会去不干净，用这个方法可以去干净
            
            ptr[0] = 0;
            
        }
    }
    
}
    // 将内存转成image
     
    CGDataProviderRef dataProvider =CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, nil);
     
     
     
    CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight,8, 32, bytesPerRow, colorSpace,
                                        
                                        kCGImageAlphaLast |kCGBitmapByteOrder32Little, dataProvider,
                                        
                                        NULL, true,kCGRenderingIntentDefault);
     
    CGDataProviderRelease(dataProvider);
     
    UIImage* resultUIImage = [UIImage imageWithCGImage:imageRef];
     
    // 释放
     
    CGImageRelease(imageRef);
     
    CGContextRelease(context);
     
    CGColorSpaceRelease(colorSpace);
     
    return resultUIImage;
     
    }
 
@end
